package com.thread.threadfirst.studyThread1;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 16、曾经的面试题（淘宝？腾讯？）
 * 实现一个容器，提供两种方法，add、size
 * 写两个线程，线程1添加10个元素到容器中，线程2实现监控元素的个数，当个数到5个时，线程2给出提示并结束
 * <p>
 * 给list加volatile之后，t2是可以执行了，但是while的死循环很浪费CPU资源，能不能不用死循环？？
 */
public class T8 {

    //添加volatile使t2能够得到通知
    volatile List list = new ArrayList();

    public void add(Object o) {
        list.add(o);
    }

    public int size() {
        return list.size();
    }


    public static void main(String[] args) {
        T8 t8 = new T8();

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                t8.add(new Object());
                System.out.println("add " + i);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }, "t1").start();

        new Thread(() -> {
            while (true) {           //还有这里while(true)的死循环很浪费CPU内存，这里也可以优化！！！
                if (t8.size() == 5) {    //这里还是有些问题：没有加同步，如果到这一步list的size=5，但是在break之前，list又加了一次 等于6了，才break，就不精确严谨了！！！
                    break;
                }
            }
            System.out.println("t2结束……");
        }, "t2").start();

    }
}
